#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
//信号驱动程序，只有信号到来时，才会运行

static void int_handler(int s){
	write(1,"!",1);
}
int main(){

	sigset_t set,oset,saveset;
	signal(SIGINT,int_handler);//程序未结束，信号到来时2，执行handler函数
	sigemptyset(&set);
	sigaddset(&set,SIGINT);
	sigprocmask(SIG_UNBLOCK,&set,&saveset);  //解除阻塞  保存进入状态
	sigprocmask(SIG_BLOCK,&set,&oset);        //阻塞   保存非阻塞状态为oset 
	for(int j = 0 ;j < 100;j++){
		for(int i = 0; i< 10;i++){   //每秒打印一个*到控制台
		 	write(1,"*",1);
			sleep(1);      
		}
		write(1,"\n",1);
		sigsuspend(&oset);     //解除阻塞，等待信号，然后阻塞 原子化操作

		/*以下代码思路上可以，但是由于操作非原子化，所以两句之间会被信号打断，sigsuspend（）就是对以下过程的原子化操作
		sigset_t tmpset;
		sigprocmask(SIG_SETMASK,&oset,&tmpset); //解除阻塞  保存阻塞为tmpset状态
		pause();                                //等待信号的到来
		sigprocmask(SIG_SETMASK,&tmpset,NULL);  //阻塞   
		*/  
	}

	sigprocmask(SIG_SETMASK,&saveset,NULL); //恢复进入的状态


	exit(0);
}
